/**
 * Web平台需求文档生成提示词
 * 用于从Axure Web原型HTML生成结构化需求文档
 */

interface WebPromptOptions {
  systemName?: string;
  moduleName?: string;
  pageMode?: 'new' | 'modify';
  businessDescription?: string;
  redFields?: string[];
}

export function getWebRequirementPrompt(options: WebPromptOptions): string {
  const { systemName, moduleName, pageMode, businessDescription, redFields = [] } = options;

  return `# 📋 Axure HTML 解析策略

## 1️⃣ 页面类型识别

**🔥 识别规则(按优先级从高到低):**

**第一优先级:看按钮文本**(最重要!)

⚠️ **Axure按钮识别规则**:
   - 在Axure原型中,按钮通常是div标签(class包含"box_2"或"button"),而不是button标签
   - 按钮文本在嵌套的div或span标签中
   - 示例结构:外层div包含class="ax_default box_2",内层包含class="text"的div,最内层是p和span标签包含按钮文本
   - **搜索策略**:在所有包含class="text"的div或span标签中查找"保存"、"撤销"、"提交"等按钮关键词

1. **表单页按钮特征**:
   - 文本包含"保存"/"提交"/"撤销"/"取消"/"确认提交"/"创建"/"新建"/"确定" → **表单页**
   - ⚠️ **"撤销"按钮是表单页的典型标志**,详情页不会有撤销按钮
   - 示例:span标签中包含"保存"、"撤销"文本 → 表单页

2. **列表页按钮特征**:
   - 文本包含"查询"/"搜索"/"导出"/"批量删除"且有表格结构 → **列表页**

3. **详情页按钮特征**:
   - 只有"编辑"/"返回"/"打印"/"关闭"且无可编辑控件 → **详情页**

**第二优先级:看可编辑控件**
1. **有以下任一类型即为表单页**:
   - \`<input type="text/number/password/email">\` 输入框
   - \`<textarea>\` 多行文本框
   - \`<select>\` 下拉选择框
   - 单选按钮(\`<input type="radio">\` 或 class包含"radio")→ **重要!单选按钮一定是表单页**
   - 多选框(\`<input type="checkbox">\` 或 class包含"checkbox")

2. **完全没有可编辑控件** → **详情页**
   - 只有只读文本、标签、展示字段
   - 字段值直接显示为纯文本,无需用户输入

**第三优先级:看页面结构**
- 有 \`<table>\` 或 \`class="table"\` 且有"查询"按钮 → **列表页**
- 页面较小且有"确定"/"取消"按钮 → **弹窗**

**⚠️ 关键区分点**:
- **表单页 vs 详情页的核心区别**:
  - 表单页:可以编辑数据(有输入框/单选/多选),有"保存"/"撤销"按钮
  - 详情页:只能查看数据(纯文本展示),只有"编辑"/"返回"按钮

- **表单页的"重置" vs 列表页的"重置"**:
  - 表单页的重置:在"保存"/"撤销"附近,用于清空表单内容
  - 列表页的重置:在"查询"/"搜索"附近,用于清空查询条件

## 2️⃣ 查询条件识别(重点!)

**🚨 核心规则:查询条件 ≠ 表单字段**

**识别步骤:**
1. **先找到"搜索"或"查询"按钮** (文本包含 "搜索"/"查询"/"重置" 的button或div)
2. **向上遍历DOM树**,找到该按钮所在的父容器(通常是form或div)
3. **提取该容器内的所有输入控件**(input、select、date-picker等)
4. 这些控件就是"查询条件",**不要归类为"表单字段"**

**示例HTML结构:**
\`\`\`html
<div class="query-section">
  <input placeholder="订单号" />
  <select><option>全部状态</option></select>
  <button>搜索</button>
  <button>重置</button>
</div>
\`\`\`
→ 上述input和select应识别为**查询条件**,不是表单字段

## 3️⃣ 列表字段识别

**识别规则:**
- 找到表格的列头行(通常是 \`<thead>\` 或第一个 \`<tr>\`)
- 从 \`<th>\` 或 \`<div class="label">\` 中提取字段名
- 如果有"操作"列,提取该列中的所有按钮(详情、编辑、删除等)

**⚠️ 常见Axure表格结构:**
\`\`\`html
<div class="table">
  <div class="row header">
    <div class="cell"><div class="label">订单号</div></div>
    <div class="cell"><div class="label">客户名称</div></div>
    <div class="cell"><div class="label">操作</div></div>
  </div>
</div>
\`\`\`
→ 提取字段:订单号、客户名称、操作

## 4️⃣ 操作按钮去重规则

**问题:** 列表页中的"详情"按钮可能在每一行都出现,导致重复识别

**去重策略:**
1. 提取所有按钮的文本内容(button、a标签、可点击的div)
2. **如果同一按钮文案出现多次**(如"详情"出现10次):
   - 只在"操作按钮"表格中记录**一条**
   - 在"位置"列标注"每行操作列"或"表格操作列"
3. 如果按钮只出现一次(如页面顶部的"新增"按钮):
   - 正常记录,标注具体位置(如"页面顶部")

**示例输出:**
| 按钮名称 | 位置 | 操作说明 |
|---------|------|---------|
| 新增 | 页面顶部 | 打开新增弹窗 |
| 详情 | 表格操作列(每行) | 查看该行数据详情 |
| 编辑 | 表格操作列(每行) | 编辑该行数据 |
| 删除 | 表格操作列(每行) | 删除该行数据 |

## 5️⃣ 弹窗/对话框识别(针对Axure原型增强)

**🔥 Axure弹窗特征识别(优先级从高到低)**:

1️⃣ **通过data-label属性识别**(最准确):
   - 查找 \`data-label\` 属性包含"弹窗"、"对话框"、"确认"、"提示"、"审核"、"下单"等关键词的元素
   - 示例: \`<div data-label="审核弹窗">\`, \`<div data-label="下单确认弹窗">\`
   - **必须使用data-label的值作为弹窗名称**

2️⃣ **通过class名识别**:
   - class包含: "modal"、"dialog"、"popup"、"layer"、"panel_state"
   - Axure特有: \`class="ax_default_hidden"\` 表示默认隐藏的弹窗
   - 组合识别: \`<div id="uXXXX" class="ax_default" data-label="XXX弹窗">\`

3️⃣ **通过结构特征识别**:
   - 包含"确定"和"取消"按钮的**小型**容器(非整个页面)
   - 包含"同意"/"拒绝"、"是"/"否"等对立选项的容器
   - 有单选框(radio)或多选框(checkbox)组合表单的独立容器
   - 尺寸固定且相对较小的独立容器

⚠️ **弹窗 vs 表单页的区分**:
   - **弹窗**:页面中的一个小型浮层,包含确认/取消按钮,通常用于快速操作或二次确认
   - **表单页**:整个页面都是表单,包含保存/撤销按钮,用于创建或编辑完整数据
   - 判断依据:如果整个HTML页面都是一个大表单(不是嵌套在其他页面中的小弹窗),则应识别为**表单页**而非弹窗

4️⃣ **通过style属性识别**:
   - \`display:none\` 或 \`visibility: hidden\` 表示初始隐藏
   - \`position: fixed\` 或 \`position: absolute\` 表示浮层

**⚠️ 错误弹窗过滤规则**:
- **忽略导航相关**: 用户信息下拉框(如"修改密码"/"退出"菜单)、侧边栏菜单
- **忽略下拉选项**: 下拉菜单的选项列表、更多操作的下拉面板
- **只识别业务操作弹窗**: 与数据提交、审核、确认等业务操作相关的模态弹窗

**处理方式:**
- 为每个弹窗创建独立的功能点章节(如 ### 1.2 审核弹窗)
- 章节标题必须使用data-label属性值或从弹窗内容推断的准确名称
- 完整提取弹窗内的表单字段、单选框、多选框、输入框和按钮
- 在章节开头标注弹窗来源(如: 来源: data-label="审核弹窗")

## 6️⃣ 下拉框选项提取

**识别规则:**
- 找到所有 \`<select>\` 标签
- 提取其中所有 \`<option>\` 的文本内容
- 在"可选值/枚举"列中用斜杠分隔,如:"待审核/已审核/已完成/已取消"

## 7️⃣ 业务规则提取(重点增强!)

**🔥 从Axure注释表格中提取业务规则**(关键!)

**识别场景**:
Axure原型中常见的业务规则表达方式:
1. **独立的业务规则说明表格**(class="table"且包含"业务规则"列)
2. **字段说明表格中的"备注"/"需求描述"列**
3. **按钮/功能说明表格中的"备注"/"需求描述"/"补充说明"列**
4. **红色文字标注的重要规则**(style="color:#D9001B" 或 style="color:red")

**提取规则**:

1️⃣ **查找业务规则表格结构**:
\`\`\`html
<!-- 典型的Axure业务规则表格 -->
<div class="table">
  <div class="row header">
    <div class="cell">按钮/图标/模块</div>
    <div class="cell">备注</div>
  </div>
  <div class="row">
    <div class="cell">列表数据</div>
    <div class="cell">
      1、结算总金额计算规则...
      2、审核规则...
      3、拦截规则...
    </div>
  </div>
</div>
\`\`\`

2️⃣ **识别关键特征**:
- **表头包含**: "备注"、"需求描述"、"业务规则"、"注意事项"、"补充说明"
- **单元格内容特征**:
  - 包含数字编号(1、 2、 3、 或 1. 2. 3.)
  - 包含红色文字标注(极重要!)
  - 包含长段落文字说明(超过50个字符)
- **内容关键词**: "需要"、"必须"、"禁止"、"校验"、"拦截"、"提示"、"计算"、"拉取"、"自动"、"超时"

3️⃣ **红色文字识别**(极重要!):
\`\`\`html
<!-- 红色文字通常表示核心业务规则、校验规则、拦截规则 -->
<span style="color:#D9001B;">审核通过时,需要校验库存...</span>
<span style="color:red;">必须拦截并提示...</span>
\`\`\`
→ **凡是红色文字,必须作为核心业务规则提取到需求文档的"业务规则"章节**
→ 可以在规则前加 ⚠️ 标记表示这是从红色文字提取的重要规则

4️⃣ **提取并格式化输出**:
- 将表格中的所有业务规则提取到"#### 业务规则"章节
- 保持原有的数字编号格式(1、或1.)
- 红色文字规则要特别标注(加⚠️前缀)或放在开头
- **完整保留原文表述**,不要简化、改写或省略
- 如果规则很长,保持完整的多行格式

5️⃣ **从其他元素推断业务规则**:
- **从字段名推断**:如"审核意见"字段 → 可能有审核流程
- **从按钮文案推断**:如"提交审核" → 需要审核权限控制
- **从class/id推断**:如 \`class="required"\` → 该字段必填
- **从提示文本推断**:如 placeholder="请输入6-20位密码" → 密码长度限制

**输出示例**:
#### 业务规则
1. **结算总金额(集采含税采购成本)(元)**: 显示询价单内所有商品的含税采购成本之和+运费
2. **结算总金额(集采含税V链供应价)(元)**: 显示询价单内所有商品的含税V链供应价之和+运费(也就是SaaS后台能看到的价格)
3. **审核流程规则**:
   - 平台采购点击审核通过后,礼品公司方可进入下一步上传地址或手动取消
   - ⚠️ **审核通过时,需要输入期望回复时效,礼品公司超时未上传则询价单自动终止结束**
   - ⚠️ **审核同意时需要校验库存是否能扣减成功,若库存不够则无法审核通过**
   - ⚠️ **审核同意时需要校验商品是否能正常拉取含税采购成本(商品状态是否可售挑选),否则将无法审核通过**
   - 当礼品公司上传完地址后,则采购审核地址确认下单即正式下单
   - 当礼品公司手动取消后,该询价单终止,状态为终止
4. **确认下单规则**:
   - 平台采购点击后,若审核通过则正式进入下单;如拒绝,则该询价单状态为已拒绝,流程结束
   - 下单后的订单及商品金额以询价单内的价格为准
   - ⚠️ **当存在商品运费拉取失败时,审核通过需要拦截并提示"存在商品运费拉取失败,请核查处理后刷新重试"**
   - 审核拒绝时,无需拦截
5. **导出规则**: 除操作栏,其他字段均需导出

(注:⚠️ 标记表示从原型红色文字规则提取的核心规则)

---

# 📄 输出格式规范

\`\`\`markdown
# ${systemName || '系统名称'} - ${moduleName || '模块名称'}需求文档

## 1. 功能模块1

### 1.1 功能点名称

#### 功能描述
简要描述该功能的业务目标和用途。

#### 页面类型
列表页 / 详情页 / 表单页 / 弹窗

---

### 📋 如果是列表页,必须包含以下章节:

#### 查询条件(如果有查询区域)
| 字段名 | 控件类型 | 必填 | 默认值 | 说明 | 来源 |
|--------|---------|------|--------|------|------|
| 订单号 | 文本框 | 否 | - | 输入订单号进行搜索 | 查询区域input |
| 订单状态 | 下拉框 | 否 | 全部 | 选择订单状态筛选 | 查询区域select |

#### 列表展示字段(🔥 必须有!)
| 字段名 | 数据类型 | 格式 | 说明 | 来源 |
|--------|---------|------|------|------|
| 订单号 | 文本 | - | 显示订单编号 | 表格列头 |
| 客户名称 | 文本 | - | 显示客户名称 | 表格列头 |
| 申请日期 | 日期 | YYYY-MM-DD | 显示申请日期 | 表格列头 |
| 订单金额 | 数字 | ¥0.00 | 显示订单金额 | 表格列头 |
| 状态 | 文本 | - | 订单状态 | 表格列头 |
| 操作 | 按钮组 | - | 包含详情/编辑/删除按钮 | 表格列头 |

#### 操作按钮
| 按钮名称 | 位置 | 按钮类型 | 触发条件 | 操作说明 | 来源 |
|---------|------|---------|---------|---------|------|
| 查询 | 查询区域 | 主要 | 无 | 根据查询条件筛选数据 | 查询按钮 |
| 重置 | 查询区域 | 次要 | 无 | 清空查询条件 | 重置按钮 |
| 新增 | 页面顶部 | 主要 | 无 | 打开新增弹窗 | 页面按钮 |
| 详情 | 表格操作列(每行) | 链接 | 无 | 查看该行数据详情 | 行内按钮 |
| 编辑 | 表格操作列(每行) | 链接 | 有编辑权限 | 编辑该行数据 | 行内按钮 |
| 删除 | 表格操作列(每行) | 危险 | 有删除权限 | 删除该行数据 | 行内按钮 |

---

### 📝 如果是表单页,必须包含以下章节:

#### 表单字段
| 字段名 | 控件类型 | 必填 | 默认值 | 说明 | 可选值/枚举 | 验证规则 | 来源 |
|--------|---------|------|--------|------|-----------|---------|------|
| 客户名称 | 文本框 | 是 | - | 输入客户名称 | - | 2-50字符 | input标签 |
| 订单状态 | 下拉框 | 是 | 待审核 | 选择订单状态 | 待审核/已审核/已完成/已取消 | - | select标签 |
| 订单金额 | 数字输入框 | 是 | - | 输入订单金额 | - | 大于0 | input[type=number] |
| 备注 | 多行文本框 | 否 | - | 输入备注信息 | - | 最多500字符 | textarea |

#### 操作按钮
| 按钮名称 | 按钮类型 | 触发条件 | 操作说明 | 来源 |
|---------|---------|---------|---------|------|
| 保存 | 主要 | 表单验证通过 | 保存表单数据 | button标签 |
| 提交审核 | 主要 | 表单验证通过 | 提交数据并发起审核 | button标签 |
| 取消 | 次要 | 无 | 关闭表单,不保存 | button标签 |

#### 业务规则
1. 订单金额必须大于0
2. 提交审核后,订单状态变更为"待审核",不可再编辑
3. 只有订单创建人和管理员可以编辑订单
4. ...

#### 交互说明
1. 用户点击"保存"按钮时,仅保存数据,不改变订单状态
2. 用户点击"提交审核"按钮时,需二次确认,确认后订单进入审核流程
3. 当订单金额超过10000元时,需要财务主管审核
4. ...

---

### 📄 如果是详情页:

#### 详情字段
| 字段名 | 数据类型 | 格式 | 说明 | 来源 |
|--------|---------|------|------|------|
| 订单号 | 文本 | - | 订单编号 | 页面div/span |
| 客户名称 | 文本 | - | 客户名称 | 页面div/span |
| ...

#### 操作按钮
| 按钮名称 | 按钮类型 | 触发条件 | 操作说明 |
|---------|---------|---------|---------|
| 编辑 | 主要 | 有编辑权限 | 跳转到编辑页面 |
| 返回 | 次要 | 无 | 返回列表页 |

---

### 🪟 如果是弹窗:

为弹窗创建独立章节,格式与表单页相同

\`\`\`

---

# 🚨 重要规范

## 中文术语规范
**页面类型必须使用中文:**
- ❌ 不要用: list, dialog, form, detail, modal
- ✅ 必须用: 列表页, 弹窗, 表单页, 详情页, 对话框

**元素类型必须使用中文:**
- ❌ 不要用: input, button, select, checkbox, radio
- ✅ 必须用: 文本框, 按钮, 下拉框, 复选框, 单选框

## 查询条件 vs 表单字段
**🚨 最重要的区分规则:**
- **查询条件**:位于"搜索"/"查询"按钮附近的输入控件,用于筛选数据
- **表单字段**:用于新增/编辑数据的输入控件

**判断方法:**
1. 找到"搜索"/"查询"/"重置"按钮
2. 该按钮所在容器内的输入控件 → 查询条件
3. 其他容器内的输入控件 → 表单字段

## 列表展示字段提取
**🔥 列表页必须有"列表展示字段"章节!**
- 从表格列头提取所有字段名
- 包括"操作"列(说明包含哪些按钮)
- 推断数据类型和格式

## 按钮去重
- 如果同一按钮出现多次(如"详情"按钮在每行都有)
- 只记录一条,在"位置"列标注"表格操作列(每行)"

## 下拉框枚举
- 必须提取select标签中的所有option选项
- 在"可选值/枚举"列中用斜杠分隔
- 例如:"待审核/已审核/已完成/已取消"

---

请严格按照上述策略分析HTML并生成需求文档。

${pageMode === 'modify' ? `
# 🆕 修改页面模式特别说明

这是一个【修改页面】,页面上的红色标记代表本次迭代新增或修改的UI元素。

## 📋 业务描述(本次迭代的变更说明)
${businessDescription || '(未找到业务描述,请根据页面红色标记自行推断)'}

## 🔴 页面上的红色字段(新增的UI元素)
${redFields.length > 0 ? redFields.map((f, i) => `${i + 1}. ${f}`).join('\n') : '(未检测到红色字段)'}

## 你的任务

1. **分析变更内容**:
   - 从业务描述中识别变更类型:
     * 包含"新增"、"增加"、"添加" → 🆕 新增功能
     * 包含"修改"、"调整"、"变更" → ✏️ 修改功能
     * 包含"删除"、"移除" → ❌ 删除功能

2. **生成需求文档格式**:
   - 在需求文档开头增加【变更摘要】章节
   - 标注每个变更点的类型(🆕 ✏️ ❌)

3. **变更摘要格式**:
\`\`\`markdown
## 变更摘要

### 🆕 新增功能
- 列表新增【渠道集采订单编号】字段
- 列表新增【订单来源】字段
- 筛选条件新增【订单来源】下拉框
...

### ✏️ 修改功能
- 含税采购价计算逻辑调整:根据订单类型采用不同方式
...

### ❌ 删除功能
- (如果有)

### ➖ 原有功能(未变更)
- 订单列表基本展示
- 供应商筛选
...(简要列出)
\`\`\`

4. **测试重点建议**:
   - 在需求文档末尾增加【测试重点】章节
   - 标注哪些是新增测试点(需重点测试)
   - 标注哪些是回归测试点(需验证修改)
` : ''}`;
}
